package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IRepBeneficioOtorgadoDAO;
import co.gov.medellin.ssti.sub.model.dao.ISubprogramaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.RepAtributoVO;
import co.gov.medellin.ssti.sub.model.vo.RepBeneficioOtorgadoVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

public class RepBeneficioOtorgadoService {

	/**
	 * 
	 * @param criteria
	 * @return
	 * @throws SQLException
	 */
	public Collection<RepBeneficioOtorgadoVO> findBeneficioOtorgadoByCriteria(
			RepBeneficioOtorgadoVO criteria) throws SQLException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO
					.findBeneficioOtorgadoByCriteria(criteria);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param criterea
	 * @return
	 * @throws DAOException
	 */
	public Collection<RepBeneficioOtorgadoVO> findBeneficioOtorgadoConGestorByCriteria(
			RepBeneficioOtorgadoVO criteria) throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO
					.findBeneficioOtorgadoConGestorByCriteria(criteria);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeAtri
	 * @return
	 * @throws SQLException
	 */
	public Collection<VflexVO> findListaAtri(Long codeAtri) throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO.findListaAtri(codeAtri);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeSubprograma
	 * @return
	 * @throws DAOException
	 */
	public Collection<RepAtributoVO> findAtributoEspecificos(
			Long codeSubprograma) throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO
					.findAtributoEspecificos(codeSubprograma);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	public Collection<ProgramaVO> findProgramaByUserReport(Long codeUser,
			String userGroupName, Long codeArea) throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO.findProgramaByUserReport(codeUser,
					userGroupName, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeUser
	 * @param userGroupName
	 * @param codeArea
	 * @return
	 * @throws DAOException
	 */
	public Collection<ProgramaVO> findProgramaWithGestorByUserReport(
			Long codeUser, String userGroupName, Long codeArea)
			throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO.findProgramaWithGestorByUserReport(
					codeUser, userGroupName, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

	public Collection<SubprogramaVO> findSubProgramaWithGestorByUserReport(
			Long codeUser, String userGroupName, String codeprograma,
			Long codeArea) throws DAOException {
		ISubprogramaDAO subprogramaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			subprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getSubprogramaDAO(con);

			SubprogramaVO subProgVO = new SubprogramaVO();
			subProgVO.setCodePrograma(new Long(codeprograma));
			return subprogramaDAO.findAllowedSubprogramaWithGestorByCriteria(
					subProgVO, codeUser, userGroupName, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (subprogramaDAO != null) {
				if (!subprogramaDAO.isConnClosed()) {
					subprogramaDAO.close();
				}
			}
		}
	}

	public Collection<SubprogramaVO> findSubProgramaByUserReport(Long codeUser,
			String userGroupName, String codeprograma, Long codeArea)
			throws DAOException {
		ISubprogramaDAO subprogramaDAO = null;

		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			subprogramaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getSubprogramaDAO(con);

			SubprogramaVO subProgVO = new SubprogramaVO();
			subProgVO.setCodePrograma(new Long(codeprograma));
			return subprogramaDAO.findAllowedSubprograma(subProgVO, codeUser,
					userGroupName, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (subprogramaDAO != null) {
				if (!subprogramaDAO.isConnClosed()) {
					subprogramaDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeUser
	 * @param userGroupName
	 * @param codePrograma
	 * @param codeArea
	 * @return
	 * @throws DAOException
	 */
	public Collection<SubprogramaVO> findPermissionsReport(Long codeUser,
			String userGroupName, Long codePrograma, Long codeArea)
			throws DAOException {
		IRepBeneficioOtorgadoDAO repBeneficioOtorgadoDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			repBeneficioOtorgadoDAO = DAOFactory.getDAOFactory(
					DAOFactory.ORACLE).getRepBeneficioOtorgadoDAO(con);
			return repBeneficioOtorgadoDAO.findPermissionsReport(codeUser,
					userGroupName, codePrograma, codeArea);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (repBeneficioOtorgadoDAO != null) {
				if (!repBeneficioOtorgadoDAO.isConnClosed()) {
					repBeneficioOtorgadoDAO.close();
				}
			}
		}
	}

}
